关于Dijstra的初级运用是,在第一标尺的基础上有下面三个角度:
- 边权:c[maxn] = {maxn}, cost[manx][maxn] = {inf};
- 点权:w[maxn] = {0}, weight[maxn] = {0};
- 最短路径条数:num[maxn] = {0};
a1003.cpp 用到了其中的两个,作为模板来刻意练习,练习如何将问题结构化,模板化。
再额外补充边权的代码,不是这道题的,但是加进来使其完整。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxv = 510; // 最大顶点数
const int inf = 1 << 30;
int G[maxv][maxv], weight[maxv],cost[maxv][maxv]; // 定义图的邻接矩阵存法,点权
int d[maxv] = {inf} ; //记录从起点s到u的最短距离,
int n,m,st,ed; // n:顶点数,m:边数
int w[maxv],num[maxv]c[manv]; // w:记录最大点权之和,num:最短路径条数
bool vis[maxv] = {
false}; // 标记是否已经访问
// 最朴素的迪杰斯塔拉就是为了找到最短路径,最终效果是更新了d数组,
// 但是在产生d数组的过程中,有意思的事情正在发生
void Dijkstra(int s)
{
// 初始化
fill(d,d + maxv, inf); //
fill(num,num + maxv, 0);
fill(w,w + maxv, 0);
d[s] = 0;
w[s] = weight[s];
num[s] = 1;
// 循环n次
for(int i = 0; i < n; i++)
{
// 找到u和最小值
int